package exprarbre;

import java.util.HashMap;
import progarbre.ASAFonction;
import progarbre.ASAProg;

public class ASACall extends ASAExpr {

    private String identifiant;
    private ASAListExpr parametres;
    private int pointeur;
    private HashMap<String, Integer> affectation;

    public ASACall(String identifiant, ASAExpr parametres) {
        this.identifiant = identifiant.toUpperCase();
        this.parametres = (ASAListExpr) parametres;
    }

    public void setPointeur(int p) {
        pointeur = p;
    }

    public void setValeurPointeur(int valeur) {
        ASAProg.set(pointeur, valeur);
    }

    @Override
    public String getLabelExplorateur() {
        return "CALL  " + identifiant;
    }

    @Override
    public void setPointeur(HashMap<String, Integer> affectation) {
        this.affectation = affectation;
        this.parametres.setPointeur(affectation);
        if (ASAProg.getFonction(identifiant, parametres.getNbExpr()) == null) {
            throw new RuntimeException(identifiant + " est une fonction inconnu");
        }
    }

    @Override
    public int evalue() {
        ASAFonction fonction = ASAProg.getFonction(identifiant, parametres.getNbExpr());

        int bottom = ASAProg.getBottom();
        int top = ASAProg.getEndContext();
        ASAProg.setBottom(ASAProg.getEndContext() + 1);
        ASAProg.setEndContext(ASAProg.getBottom() + fonction.getNbDeclare());
        ASAProg.push(0);

        parametres.evalue();

        fonction.interpreter();

        while (ASAProg.getTop() > ASAProg.getBottom() + 1) {
            ASAProg.pop();
        }

        int resultat = ASAProg.pop();
        ASAProg.setBottom(bottom);
        ASAProg.setEndContext(top);
        return resultat;
    }
}
